#pragma once

#include <iostream>
#include <string>
#include "Protocol.hpp"
#include "Connection.hpp"
#include "CalCulate.hpp"

using namespace protocol_ns;

class PackageParse
{
public:
    static void Parse(Connection *con)
    {
        // 2. 分析数据，得到完整报文（因为读取的数据中可能有多个报文，需要循环处理）
        std::string package;
        Request req;
        CalCulate cal;

        while (true)
        {
            // 将数据中的一个报文字符串提取出来,并将数据中的这个报文删除
            package = Decode(con->Inbuffer());
            if (package.empty())
                break;
            LOG(DEBUG, "server get a package-----------------");
            std::cout << package << std::endl;
            // 进行反序列化
            req.DeSerialize(package);
            // 处理数据
            Response res = cal.calculate(req);
            // 将结果序列化
            std::string out;
            res.Serialize(&out);
            // 添加报头
            out = Encode(out);
            LOG(DEBUG, "server send a protocol to client-----------------");
            con->Outbuffer() += out; // 添加到该连接的out缓冲区中
        }
        // 发送给客户端
        if(!con->OutbufferEmpty() && con->_writer != nullptr)
        {
            con->_writer(con); // out缓冲区初始就是写事件就绪的，可以直接写入，后续outbuffer满后，可以通过内核写入

            // 也可以直接设置写事件，等下一次LoopOnce检测到写事件时，由内核完成
            // con->_R->EnableReadWrite(con->SockFd(), true, true);
        }
    }
};
